package com.zhongge.utils;

import com.bit.utils.FileUtils;
import com.zhongge.book.Book;
import java.time.LocalDate;

/**
 * @ClassName AnalyzingBook
 * @Description TODO 分析图书工具类：用于文件中图书信息的存取
 * @Author zhongge
 * @Version 1.0
 */
@SuppressWarnings("all")
public class AnalyzingBook {
    //从文件中取出书本信息
    /*
    分析：这个方法将会加载文件中的信息，并且将文件中的信息存于一个临时数组中
    最后将这个数组的地址返回
     */
    /**
     * 获取数据放置在数组中
     * @param fileName 从哪一个文件中读取
     * @return 返回数组地址
     */
    public static Book[] loadBook(String fileName) {
        //首先：将文件中内容读到
        String str = FileUtils.readFile(fileName);
        //判断String中内容是否为空
        if (str.isEmpty()) {
            System.out.println("文件内容为空，读取失败！！！");
            return null;
        }
        //如果程序能走到这里，说明读到了数据
        String[] strs = str.split("\n");
        //此时，创建相同大小的Book数组
        Book[] books = new Book[strs.length];
        //将每一个元素封装成对象
        for (int i = 0; i < strs.length; i++) {
            //使用一个辅助数组将字符创变为Book对象
            books[i] = stringConvertBook(strs[i]);
        }
        //最后将books返回
        return books;
    }
    //将图书信息写入文件 store:存储

    /**
     * 减对象变为字符串并存储到文件
     * @param books 所要存的所有Book对象
     * @param fileName 所存储之所
     */
    public static void storeBook(Book[] books, String fileName) {
        //首先：看books这个数组是否为空
        if (books == null) {
            System.out.println("数组不存在！写入失败");
            return;
        }
        //如果程序走到这里，说明存在books数组
        //计算处books中的有效数据并将他写入文件
        int bookCount = 0;//默认为0
        for (int i = 0; i < books.length; i++) {
            if (books[i] != null) {
                bookCount++;
            }
        }
        if (bookCount == 0) {
            System.out.println("数组内容为空！写入失败");
            return;
        }

        //如果程序走到这里说明数组中有内容
        //进行遍历并将数据存于文件
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < bookCount; i++) {
            //首先减数据得到
            Book book = books[i];
            //将对象序列化为字符串
            String str = book.toJson();
            //此时需要将整个books数组中的每一个元素转为字符串后使用\n拼接成整体的字符串
            //最后将整体的字符串写入文件
            if (i == bookCount - 1) {
                sb.append(str);
            } else {
                sb.append(str).append("\n");
            }
        }
        //写入文件
        FileUtils.writeFile(sb.toString(), fileName);
    }

    //辅助函数用于将字符串变为Book对象
    /**
     * String转变Book对象 此方法是供给本类使用的所以设计为私有
     * @param str 待转变的数组
     * @return
     */
    private static Book stringConvertBook(String str){
        //将str以“,”切割
        String[] strs = str.split(",");
        //将字符串解析为属性
        int bookId = Integer.parseInt(strs[0]);
        String title = strs[1];
        String author = strs[2];
        String type = strs[3];
        int publishYear = Integer.parseInt(strs[4]);
        boolean isBorrow = Boolean.parseBoolean(strs[5]);
        int borrowCount = Integer.parseInt(strs[6]);
        LocalDate shelfDate = LocalDate.parse(strs[7]);
        //如果这些东西是有效的，那么就返回Book对象
        if (title != null && author != null && type != null && shelfDate != null) {
            //创建Book对象
            Book book = new Book(title, author, type, publishYear, shelfDate);
            //设置id,借阅状态,借阅次数
            book.setBookId(bookId);
            book.setBorrow(isBorrow);
            book.setBorrowCount(borrowCount);

            //将对象返回
            return book;
        }
        //如果程序走到这里说明此对象无法创建
        return null;
    }
    //测试一下：
    /*public static void main2(String[] args) {
        Book[] books = loadBook(BOOK_FILE_NAEM);
        if (books != null) {
            for (int i = 0; i < books.length; i++) {
                System.out.println(books[i]);
            }
        }
    }
    public static void main1(String[] args) {
        //先写四个Book对象
        Book[] books = new Book[4];
        books[0] = new Book("java", "gaobo", "编程", 1994, LocalDate.of(2023, 9, 24));
        books[1] = new Book("mysql", "lisi", "编程", 1999, LocalDate.of(2024, 2, 10));
        books[2] = new Book("php", "gaobo", "编程", 2020, LocalDate.of(2023, 9, 23));
        books[3] = new Book("西游记", "吴承恩", "⼩说", 2024, LocalDate.of(2023, 9, 23));

        storeBook(books, BOOK_FILE_NAEM);
    }*/
}
